package com.example.jdbc;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

@Service
public class TestTxService {
    @Autowired
    private TestTxDao txDao;

    @Autowired
    private OtherTestTxService otherTestTxService;

    /**
     * propagation 传播行为
     * Propagation.REQUIRED（默认）整个方法不开启新的事务，当
     *                      前事务方法被另一个事务方法调用，默认是调用的方法的事务
     * Propagation.REQUIRES_NEW 每个事务使用自己的事务，单独有事务方法执行，调用的方法的事务挂起
     *
     */
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void testTx() {
        txDao.t1();
        txDao.t2();
        otherTestTxService.testTx();
    }

    /**
     * 隔离级别
     *
     */
    @Transactional(isolation = Isolation.READ_COMMITTED)
    public void testIsolation() {

    }

    /**
     * 默认对运行时异常进行回滚
     * rollbackFor
     */
    @Transactional(rollbackFor = Exception.class)
    public void testRollBack() {

    }

    /**
     * readOnly:只读事务，可以帮助数据库引擎进行优化（不加锁）
     * timeout:指定强制回滚之前，事务可以占用多长时间，占用时间太长，强制回滚
     */
    @Transactional(readOnly = true, timeout = 3000)
    public void test() {

    }
}


